#!/bin/sh

add_chain() {
  RULES_CNT=`/sbin/iptables -nL $1 2>/dev/null | /usr/bin/wc -l`
  if [ $RULES_CNT -gt 2 ]; then
    /sbin/iptables -A in_mod -j $1
  else
    /sbin/iptables -X $1
  fi
}

del_chain() {
  /sbin/iptables -D in_mod -j $1 2>/dev/null || return
  /sbin/iptables -F $1
  /sbin/iptables -X $1
}

MOD_TITLE=Protocol IEC101/104
MOD_NAME=iec14
MOD_DAEMON=iec14d
MOD_BIN=/opt/$MOD_NAME/bin/$MOD_DAEMON
MOD_CHAIN=mod_iec14
MOD_DEFAULTS=/opt/$MOD_NAME/etc/defaults
MOD_SETTINGS=/opt/$MOD_NAME/etc/settings
[ -L "$MOD_SETTINGS" ] && MOD_SETTINGS=`readlink $MOD_SETTINGS`

[ -f "$MOD_SETTINGS" ] || cp $MOD_DEFAULTS $MOD_SETTINGS
[ -x "/sbin/hash_verify" ] && [ ! -f "$MOD_SETTINGS.hash" ] && cp $MOD_DEFAULTS.hash $MOD_SETTINGS.hash

. $MOD_SETTINGS

case "$1" in
  start)
    [ -x "/sbin/hash_verify" ] && ! hash_verify $MOD_SETTINGS && exit 1
    /sbin/iptables -N $MOD_CHAIN
    echo -n "Starting module $MOD_TITLE: #1"
    if [ "$MOD_IEC14_1_ENABLED" != "1" ]; then
      echo "skipped" > /var/tmp/iec14stat1
      RETVAL1=0
    else
      $MOD_BIN "1" &
      RETVAL1=$?
      [ $RETVAL1 -eq 0 ] && /sbin/iptables -A $MOD_CHAIN -p tcp --dport $MOD_IEC14_1_IEC104_PORT -j ACCEPT
      if [ $RETVAL1 = 0 ]; then echo "done" > /var/tmp/iec14stat1 ;  else echo "failed" > /var/tmp/iec14stat1 ; fi
    fi
    echo -n "Starting module $MOD_TITLE: #2"
    if [ "$MOD_IEC14_2_ENABLED" != "1" ]; then
      echo "skipped" > /var/tmp/iec14stat2
      RETVAL2=0
    else
      $MOD_BIN "2" &
      RETVAL2=$?
      [ $RETVAL2 -eq 0 ] && /sbin/iptables -A $MOD_CHAIN -p tcp --dport $MOD_IEC14_2_IEC104_PORT -j ACCEPT
      if [ $RETVAL2 = 0 ]; then echo "done" > /var/tmp/iec14stat2 ;  else echo "failed" > /var/tmp/iec14stat2 ; fi
    fi
    echo -n "Starting module $MOD_TITLE: #3"
    if [ "$MOD_IEC14_3_ENABLED" != "1" ]; then
      echo "skipped" > /var/tmp/iec14stat3
      RETVAL2=0
    else
      $MOD_BIN "3" &
      RETVAL3=$?
      [ $RETVAL3 -eq 0 ] && /sbin/iptables -A $MOD_CHAIN -p tcp --dport $MOD_IEC14_3_IEC104_PORT -j ACCEPT
      if [ $RETVAL3 = 0 ]; then echo "done" > /var/tmp/iec14stat3 ;  else echo "failed" > /var/tmp/iec14stat3 ; fi
    fi
    if [[ "$RETVAL1"==0 ]] || [[ "$RETVAL2"==0 ] || [[ "$RETVAL3"==0 ]] ; then
      add_chain $MOD_CHAIN
      exit 0
    else
      exit 1
    fi
    ;;
  stop)
    echo -n "Stopping module $MOD_TITLE: "
    del_chain $MOD_CHAIN
    killall $MOD_DAEMON  2> /dev/null
    RETVAL=$?
    if [ $RETVAL = 0 ]; then echo "done" ; else echo "failed"; fi
    sleep 2
    killall -9 $MOD_DAEMON  2> /dev/null
    exit $RETVAL
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  status)
    echo -n "Module $MOD_TITLE is "
    killall -0 $MOD_DAEMON 2> /dev/null
    RETVAL=$?
    if [ $RETVAL = 0 ]; then echo "running"; else echo "stopped"; fi
    exit $RETVAL
    ;;
  defaults)
    cp $MOD_DEFAULTS $MOD_SETTINGS 2> /dev/null
    [ -f "$MOD_DEFAULTS.hash" ] && cp $MOD_DEFAULTS.hash $MOD_SETTINGS.hash
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|status|defaults}"
  exit 1
esac
